package estado;

import comunicacion.Cliente;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
import mensaje.Mensaje;
import mensaje.MsjEvento;
import mensaje.MsjFinPartida;
import servidor.GestorPartida;

/**
 * Responsabilidad: Implementar métodos para el estado Jugando de recepción de mensajes
 * desde el cliente, desde la cola de entrada y envío de errores.
 */
public class Jugando implements Estado{

    public Mensaje recibeDeSocket(ObjectInputStream objin, EstadoPartida estadoPartida, Cliente cliente) {
        Object mensaje;
        try {
            mensaje = objin.readObject();
            if (mensaje instanceof MsjEvento) {
                return (MsjEvento) mensaje;
            }else if(mensaje instanceof MsjFinPartida){
                System.out.println("El jugador "+((MsjFinPartida)mensaje).getId()+" se quiere ir!!");
                return (MsjFinPartida)mensaje;
            }else {
                System.out.println("Mensaje incorrecto para el estado, estado: Jugando");
                return null;
            }
        } catch (IOException ex) {
            Logger.getLogger(Jugando.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Jugando.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    public Mensaje enviarError(EstadoPartida estadoPartida){
        return new Mensaje();
    }

    public Object recibeDeCola(EstadoPartida estadoPartida, Mensaje mensaje, GestorPartida gestorPartida) {
        if (mensaje instanceof MsjEvento){
            if( ((MsjEvento)mensaje).getAccion()=='F')
                gestorPartida.getGestorJuego().crearBala(((MsjEvento)mensaje).getId());
            else
                gestorPartida.getGestorJuego().mover(((MsjEvento)mensaje).getId(), ((MsjEvento)mensaje).getAccion());
        }else if (mensaje instanceof MsjFinPartida){
            gestorPartida.eliminarJugador(((MsjFinPartida)mensaje).getId());
            gestorPartida.getGestorJuego().eliminarJugador(((MsjFinPartida)mensaje).getId());
        }
        return gestorPartida;
    }
}